﻿using UnityEngine;
using System.Collections;


/// <summary>
/// 게임 씬 전반을 관리하는 객체
/// </summary>
public class GameScene : MonoBehaviour
{
	// Properties

	[SerializeField]
	GameCamera			m_gameCamera;
	[SerializeField]
	World				m_worldRoot;			// 월드 루트
	[SerializeField]
	BaseCharacter		m_playerCharacter;		// 플레이어 캐릭터 (자동으로 세팅됨)



	// Members


	bool				m_gameReady	= false;	// 게임이 모두 준비되었는지 여부
	int					m_codexPointForRevert;	// 나중에 되돌릴 수 있는 보인 포인트


	static GameScene	s_instance;				// 인스턴스 (싱글톤 객체)
	/// <summary>
	/// 내부적으로 이 오브젝트를 참조하기 위한 프로퍼티.
	/// </summary>
	/// <value>The instance.</value>
	static GameScene instance
	{
		get
		{
			if(s_instance == null)
			{
				GameObject obj	= GameObject.FindGameObjectWithTag("GameScene");
				s_instance		= obj.GetComponent<GameScene>();
			}
			return s_instance;
		}
	}

	/// <summary>
	/// 초기화시 로딩할 스테이지 정보
	/// </summary>
	/// <value>The stage data to load.</value>
	public static StageInfo stageDataToLoad
	{
		get;
		set;
	}


	/// <summary>
	/// 플레이어 캐릭터 레퍼런스
	/// </summary>
	/// <value>The player character.</value>
	public static BaseCharacter playerCharacter
	{
		get
		{
			return instance.m_playerCharacter;
		}
	}

	/// <summary>
	/// 게임 카메라 레퍼런스
	/// </summary>
	/// <value>The game camera.</value>
	public static GameCamera gameCamera
	{
		get
		{
			return instance.m_gameCamera;
		}
	}

	public static World worldRoot
	{
		get
		{
			return instance.m_worldRoot;
		}
	}



	public static bool gameReady
	{
		get
		{
			return instance.m_gameReady;
		}
	}



	void Awake()
	{
		if(s_instance != null)						// * GameScene 객체가 이미 존재하는 경우. 있을 수 없다....
		{
			Debug.LogError("GameScene is duplicated!");
			Object.DestroyImmediate(this);
			return;
		}

		s_instance	= this;							// 인스턴스 보관

		// TEST : 테스트 스테이지 로딩
		if(stageDataToLoad == null)
		{
			//CodexManager.clearCount	= 3;//TEST
			stageDataToLoad	= StageInfos.stage5;
		}
													
		if(stageDataToLoad == null)
		{
			Debug.LogWarning("No stage data set!");
			GameUI.stageSplash.showing	= false;
		}
		else
		{
			StartCoroutine(SceneReadyProcess());		// 로딩 프로세스 시작
		}
	}

	/// <summary>
	/// 씬 로딩 프로세스
	/// </summary>
	/// <returns>The ready process.</returns>
	IEnumerator SceneReadyProcess()
	{
		StageSplash stageSplash		= GameUI.stageSplash;
		m_gameReady					= false;

		if(stageDataToLoad != null)					// * 스테이지 데이터 로딩
		{
			stageSplash.title			= stageDataToLoad.stageName;
			gameCamera.followingMode	= stageDataToLoad.camFollowingMode;

			if(stageDataToLoad == StageInfos.epilogue)		// 에필로그일 때만 변경된 아이콘 사용
			{
				stageSplash.UseAltIcon();
			}
		}

		yield return new WaitForSeconds(1f);		// 딜레이

		if(stageDataToLoad != null)					// * 월드 데이터 로딩
		{
			m_worldRoot.LoadWorld(stageDataToLoad.worldInfo);
		}

		m_gameReady					= true;			// 준비 완료
		stageSplash.showing			= false;		// 시간이 되었으므로 스플래시 없애기

		BgmData bgm	= stageDataToLoad.worldInfo.worldBgm;	// BGM 재생
		if(bgm != null)
		{
			SoundManager.PlayBgm(bgm);
		}
	}

	/// <summary>
	/// 플레이어 캐릭터
	/// </summary>
	/// <param name="character">Character.</param>
	public static void SetPlayerCharacter(PlayerCharacter character)
	{
		instance.m_playerCharacter	= character;
	}


	public static void AddCodexPoint(int point)
	{
		instance.m_codexPointForRevert	+= point;
		//CodexManager.codexPoint += point;
	}

	public static void RevertCodexPoint()
	{
		//CodexManager.codexPoint -= instance.m_codexPointForRevert;
		instance.m_codexPointForRevert	= 0;
	}

	/// <summary>
	/// Codex point 최종 합산
	/// </summary>
	public static void CommitCodexPoint()
	{
		CodexManager.codexPoint += instance.m_codexPointForRevert;
		instance.m_codexPointForRevert	= 0;
	}
}
